#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QMutex>
#include <QModbusTcpClient>
#include <QModbusClient>
#include <QModbusReply>
#include "singleProject/single_project.h"

QT_BEGIN_NAMESPACE
QT_END_NAMESPACE

class ModbusClient : public QWidget
{
    Q_OBJECT

public:
    ModbusClient(QWidget *parent = nullptr);
    ~ModbusClient();

    bool getReadData();                                         // 获取线圈读到的数据
    QModbusDataUnit getReadDataMap();                           // 获取线圈读到的数据组
    bool getWriteData();                                        // 获取线圈写入的状态
    bool getConnectStatus();                                    // 获取 modbus Server 的连接状态状态

public slots:
    void onReadReady();                                         // 读取线圈反馈
    void onModbusStateChanged(int state);                       // Modbus设备连接状态判断
    void on_btnConnect_clicked(QString ip, int port);           // 设备连接函数
    void on_ReadCoil(int address, int number);                              // 读线圈
    void on_WriteCoil(int address, quint16 value);              // 写线圈

    void ModbusClientTimer();                                   // 定时器逻辑

public:
    QModbusClient *modbusDevice = nullptr;                      // Modbus 客户端对象
    bool _readData = false;                                     // 线圈读到的数据
    QModbusDataUnit _readDataMap;                               // 线圈读到的数据组
    bool _writeData = false;                                    // 线圈写入的状态
    QString _Ip="";                                             // modbus设备 ip 地址
    int _Port=-1;                                               // modbus设备端口号
    bool _connectStatus=false;                                  // PLC设备连接状态

    QTimer *_Timer;                                             // 定时器对象

    QMutex mutex;                                               // 互斥锁对象

};
#endif // WIDGET_H
